package com.example.serialportdemo;


import android.media.MediaPlayer;
import android.os.Environment;
import android.util.Log;

import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Locale;

public class FileUtils {
    private static final String TAG = "";

    public static void saveFile(String logPath, String datas, boolean isEnd) {
        if (!true) {
            return;
        }
        if (StringUtil.isNullOrEmpty(logPath)) {
            logPath = Environment.getExternalStorageDirectory()
                    .getAbsolutePath()
                    + File.separator
                    + File.separator
                    + "XDKJ" + File.separator + DateUtils.getCurrentTimeYMD();
        }

        File file = new File(logPath);
        if (!file.exists()) {
            file.mkdirs();
        }
        try {
            FileWriter fw = new FileWriter(logPath + File.separator
                    + DateUtils.getCurrentTimeYMD() + SPApplication.getInstance().getResources().getString(R.string.app_name) + "_.log", true);
            if (isEnd) {
                fw.write(getCurTime() + "\n");
                fw.write(datas + "\n");
                fw.write("-------------------------END------------------------------");
                fw.write("\n");
            } else {
                fw.write("\n" + datas + "\n");
            }
            fw.close();
        } catch (IOException e) {
            Log.e("crash handler", "load file failed...", e.getCause());
        }

    }

    /**
     * 获取当前时间  yyyy-MM-dd HH:mm:ss
     */
    public static String getCurTime() {
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault()).format(new Date());
    }

    //-------------文件下载
    //在SD卡上创建文件
    public static File createFile(String fileName, String dir) throws IOException {
        File file = new File(Environment.getExternalStorageDirectory()
                .getAbsolutePath()
                + File.separator
                + File.separator
                + dir + File.separator + fileName);
        file.createNewFile();
        return file;
    }

    //在SD卡上创建目录
    public static File createSDDir(String dir) throws IOException {
        File dirFile = new File(Environment.getExternalStorageDirectory()
                .getAbsolutePath()
                + File.separator
                + File.separator
                + dir);
        dirFile.mkdir();//mkdir()只能创建一层文件目录，mkdirs()可以创建多层文件目录
        return dirFile;
    }

    //判断文件是否存在
    public static boolean isFileExist(String fileName, String dir, boolean isLog) {
        File file = new File( dir + File.separator + fileName);
        if (isLog) {
            Log.d(TAG, "=====: " + dir + File.separator + fileName + "," + (file.exists() ? "存在" : "不存在"));
        }
        return file.exists();
    }

    //将一个InoutStream里面的数据写入文件中
    public static File write2SDFromInput(String fileName, String dir, InputStream input) {
        File file = null;
        OutputStream output = null;
        try {
            //创建目录
            createSDDir(dir);
            //创建文件
            file = createFile(fileName, dir);
            //写数据流
            output = new FileOutputStream(file);
            byte buffer[] = new byte[4 * 1024];//每次存4K
            int temp;
            //写入数据
            while ((temp = input.read(buffer)) != -1) {
                output.write(buffer, 0, temp);
            }
            output.flush();
        } catch (Exception e) {
            System.out.println("写数据异常：" + e);
        } finally {
            try {
                output.close();
            } catch (Exception e2) {
                System.out.println(e2);
            }
        }
        return file;
    }

    public static InputStream getInputStreamFromUrl(String urlStr) throws IOException {
        //创建一个URL对象
        URL url = new URL(urlStr);
        //创建一个HTTP链接
        HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();
        //使用IO流获取数据
        InputStream inputStream = urlConn.getInputStream();
        return inputStream;
    }

    //可以下载任意文件，例如MP3，并把文件存储在制定目录（-1：下载失败，0：下载成功，1：文件已存在）

    /**
     * @param urlStr
     * @param path     除去更目录 相对路径
     * @param fileName
     * @return
     */
    public static int downloadFiles(String urlStr, String path, String fileName) {
        try {
            FileUtils fileUtils = new FileUtils();
            if (fileUtils.isFileExist(fileName, path,false)) {//判断文件是否存在
                return 1;
            } else {
                InputStream inputStream = getInputStreamFromUrl(urlStr);
                File resultFile = fileUtils.write2SDFromInput(fileName, path, inputStream);
                if (resultFile == null) {
                    return -1;
                }
            }
        } catch (Exception e) {
            System.out.println("读写数据异常:" + e);
            return -1;
        }
        return 0;
    }

    /**
     * 删除文件，可以是文件或文件夹
     *
     * @param fileName 要删除的文件名
     * @return 删除成功返回true，否则返回false
     */
    public static boolean delete(String fileName) {
        File file = new File(fileName);
        if (!file.exists()) {
            System.out.println("删除文件失败:" + fileName + "不存在！");
            return false;
        } else {
            if (file.isFile())
                return deleteFile(fileName);
            else
                return deleteDirectory(fileName);
        }
    }

    /**
     * 删除单个文件
     *
     * @param fileName 要删除的文件的文件名
     * @return 单个文件删除成功返回true，否则返回false
     */
    public static boolean deleteFile(String fileName) {
        File file = new File(fileName);
        // 如果文件路径所对应的文件存在，并且是一个文件，则直接删除
        if (file.exists() && file.isFile()) {
            if (file.delete()) {
                System.out.println("删除单个文件" + fileName + "成功！");
                return true;
            } else {
                System.out.println("删除单个文件" + fileName + "失败！");
                return false;
            }
        } else {
            System.out.println("删除单个文件失败：" + fileName + "不存在！");
            return false;
        }
    }

    /**
     * 删除目录及目录下的文件
     *
     * @param dir 要删除的目录的文件路径
     * @return 目录删除成功返回true，否则返回false
     */
    public static boolean deleteDirectory(String dir) {
        // 如果dir不以文件分隔符结尾，自动添加文件分隔符
        if (!dir.endsWith(File.separator))
            dir = dir + File.separator;
        File dirFile = new File(dir);
        // 如果dir对应的文件不存在，或者不是一个目录，则退出
        if ((!dirFile.exists()) || (!dirFile.isDirectory())) {
            System.out.println("删除目录失败：" + dir + "不存在！");
            return false;
        }
        boolean flag = true;
        // 删除文件夹中的所有文件包括子目录
        File[] files = dirFile.listFiles();
        for (int i = 0; i < files.length; i++) {
            // 删除子文件
            if (files[i].isFile()) {
                flag = deleteFile(files[i].getAbsolutePath());
                if (!flag)
                    break;
            }
            // 删除子目录
            else if (files[i].isDirectory()) {
                flag = deleteDirectory(files[i]
                        .getAbsolutePath());
                if (!flag)
                    break;
            }
        }
        if (!flag) {
            System.out.println("删除目录失败！");
            return false;
        }
        // 删除当前目录
        if (dirFile.delete()) {
            System.out.println("删除目录" + dir + "成功！");
            return true;
        } else {
            return false;
        }
    }

    /**
     * 获取文件夹下文件
     *
     * @param dirPath
     * @return 文件集合
     */
    public static File[] getFilesFromDir(String dirPath) {
        File file = new File(dirPath);
        File[] files = file.listFiles();
        return files;
    }

    /**
     * 获取文件夹下 文件名称集合
     *
     * @param dirPath
     * @return 文件名称集合
     */
    public static List<String> getFilesNameFromDir(String dirPath) {
        List<String> fileNames = null;
        File[] files = getFilesFromDir(dirPath);
        if (files == null) {
            return fileNames;
        } else {
            fileNames = new ArrayList<>();
            for (int i = 0; i < files.length; i++) {
                fileNames.add(files[i].getName());
            }
            return fileNames;
        }
    }

    /**
     *
     * @return
     */
    public static Long getMP4Time(String mpgPath){
        File file = new File(mpgPath);

        MediaPlayer meidaPlayer = new MediaPlayer();

        try {
            meidaPlayer.setDataSource(file.getPath());
            meidaPlayer.prepare();
        } catch (IOException e) {
            e.printStackTrace();
            return 0L;
        }
        long time = meidaPlayer.getDuration();//获得了视频的时长（以毫秒为单位）
        return time;
    }
}

